/*
 * @Author: soso
 * @Date: 2022-02-15 02:00:03
 * @LastEditTime: 2022-03-10 18:20:59
 * @LastEditors: Please set LastEditors
 * @Description: 系统各种检查
 * @FilePath: /gomeshsync/core/cfiles/check.go
 */
package cfiles

import (
	"context"
	"gomeshsync/cfile"
	"gomeshsync/config"
	"io/ioutil"
	"os"
	"sync"
)

// 是否可以继续处理命令
func canProcessCommands() bool {
	return TempCmds.Len() == 0
}

// 检查文件是否完成
func checkFileComplete(ctx context.Context, file *cfile.Cfile, wg *sync.WaitGroup) {
	defer wg.Done()

	conf := config.GetConfig()
	for {
		select {
		case <-ctx.Done():
			return
		default:
			_, stat := cfile.BitMapStat(file.FileMask)
			if stat == cfile.BitStatFull {
				NewFileMaskFile(file.FilePath, file.FileMask)
				return
			}
		}
		conf.SleepForRoutine()
	}
}

// 检查服务器是否存在文件数据块
func checkBlock(filePath string, blockNumber int) int {
	// 如果存在临时命令，说明正在传输远端文件
	if TempCmds.Len() > 0 {
		return TempCmds.CheckFileBlock(filePath, blockNumber)
	}

	// 从实体文件寻找
	fmpath := toFileMaskFilePath(filePath)
	if _, err := os.Stat(fmpath); err == nil {
		filemask, _ := ioutil.ReadFile(fmpath)

		if cfile.BitMapSetted(filemask, uint(blockNumber)) {
			return 1
		} else {
			return 0
		}
	} else {
		return -1
	}
}
